{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Pandas 字符串判断方法详解\n",
    "\n",
    "在数据清洗和预处理中，我们经常需要根据字符串的构成（如是否为数字、字母、大小写等）来筛选或验证数据。Pandas 提供了一系列强大的字符串判断方法，这些方法都返回一个布尔类型的 Series，方便我们进行后续的逻辑操作。\n",
    "\n",
    "本教程将详细讲解这些方法，并提供完整的代码示例。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 导入库并准备数据\n",
    "\n",
    "我们创建一个包含各种类型字符串的 DataFrame，用于演示不同判断方法的效果。我们还特意加入了一个 `None` 值，它在 Pandas 中会被处理为 `NaN`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "data = {\n",
    "    'A': ['hello', 'World', '123', '你好', '  ', 'TitleCase', 'UPPER', 'lower', 'with space', '1.23', 'char123', None, '①', 'Ⅳ'],\n",
    "    'B': ['alpha', 'Alpha', '123a', '中文', ' ', 'Not Title', 'upper', 'LOWER', 'with_symbol!', '45.6', 'another123', 'ASCII', '②', 'Ⅴ']\n",
    "}\n",
    "df = pd.DataFrame(data)\n",
    "print(\"原始 DataFrame:\")\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 字符类型判断\n",
    "\n",
    "这类方法用于判断字符串是否完全由特定类型的字符组成。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.isalpha()` - 是否全为字母\n",
    "\n",
    "判断字符串中的所有字符是否都是字母（包括汉字、日韩文等）。只要包含数字、空格或符号，就返回 `False`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_alpha'] = df['A'].str.isalpha()\n",
    "df[['A', 'A_is_alpha']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.isnumeric()` / `.str.isdigit()` / `.str.isdecimal()` - 是否全为数字\n",
    "\n",
    "这三个方法都用于判断字符串是否只包含数字字符，但范围略有不同：\n",
    "- `.str.isdecimal()`: 最严格，只识别 Unicode 十进制数字（如 '0'-'9'）。\n",
    "- `.str.isdigit()`: 范围更广，还包括一些特殊的数字字符，但不包括罗马数字或汉字数字。\n",
    "- `.str.isnumeric()`: 范围最广，能识别所有具有数字属性的 Unicode 字符，如罗马数字 'Ⅳ'、带圈数字 '①' 等。\n",
    "\n",
    "**注意**：它们都不能识别小数点 `.` 或负号 `-`，因此对浮点数字符串会返回 `False`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_numeric'] = df['A'].str.isnumeric()\n",
    "df['A_is_digit'] = df['A'].str.isdigit()\n",
    "df['A_is_decimal'] = df['A'].str.isdecimal()\n",
    "df[['A', 'A_is_numeric', 'A_is_digit', 'A_is_decimal']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.isalnum()` - 是否全为字母或数字\n",
    "\n",
    "判断字符串是否只包含字母和数字，不允许有空格或符号。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_alnum'] = df['A'].str.isalnum()\n",
    "df[['A', 'A_is_alnum']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.isspace()` - 是否全为空白字符\n",
    "\n",
    "判断字符串是否只包含空白字符（如空格、制表符 `\t`、换行符 `\n",
    "`）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_space'] = df['A'].str.isspace()\n",
    "df[['A', 'A_is_space']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.isascii()` - 是否全为ASCII字符\n",
    "\n",
    "判断字符串中的所有字符是否都属于 ASCII 编码范围。非 ASCII 字符（如 '你好'）将返回 `False`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_ascii'] = df['A'].str.isascii()\n",
    "df[['A', 'A_is_ascii']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 大小写格式判断"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.islower()` - 是否全为小写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_lower'] = df['A'].str.islower()\n",
    "df[['A', 'A_is_lower']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.isupper()` - 是否全为大写"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_upper'] = df['A'].str.isupper()\n",
    "df[['A', 'A_is_upper']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### `.str.istitle()` - 是否为标题格式\n",
    "\n",
    "判断字符串是否为标题格式，即每个单词的首字母大写，其余字母小写。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A_is_title'] = df['A'].str.istitle()\n",
    "df[['A', 'A_is_title']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 处理缺失值 (NaN)\n",
    "\n",
    "默认情况下，所有字符串判断方法在遇到 `NaN` 值时也会返回 `NaN`。我们可以通过 `na` 参数来改变这一行为。\n",
    "\n",
    "- `na=False`: 将 `NaN` 的判断结果视为 `False`。\n",
    "- `na=True`: 将 `NaN` 的判断结果视为 `True`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 默认行为，NaN -> NaN\n",
    "print(\"默认行为:\")\n",
    "print(df['A'].str.isalpha())\n",
    "\n",
    "# 使用 na=False\n",
    "print(\"\n",
    "使用 na=False:\")\n",
    "print(df['A'].str.isalpha(na=False))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 总结\n",
    "\n",
    "Pandas 的字符串判断方法是数据验证和清洗的利器。通过组合使用这些方法，可以轻松地筛选出符合特定格式要求的数据行。\n",
    "\n",
    "例如，筛选出列 'A' 中所有纯字母的行："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[df['A'].str.isalpha(na=False)]"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
